home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / alpha.arc / TRACE.C < prev    next >
C/C++ Source or Header  |  1988-07-08  |  3KB  |  156 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "iface.h"
  6. #include "trace.h"
  7.  
  8. /* Redefined here so that programs calling dump in the library won't pull
  9.  * in the rest of the package
  10.  */
  11. static char nospace[] = "No space!!\n";
  12.  
  13. dump(interface,direction,type,bp)
  14. register struct interface *interface;
  15. int direction;
  16. unsigned type;
  17. struct mbuf *bp;
  18. {
  19.     struct mbuf *tbp;
  20.     void ascii_dump(),hex_dump();
  21.     int ax25_dump(),ether_dump(),ip_dump();
  22.     int (*func)();
  23.     int16 size;
  24.  
  25.     if((interface->trace & direction) == 0)
  26.         return;    /* Nothing to trace */
  27.  
  28.     switch(direction){
  29.     case IF_TRACE_IN:
  30.         printf("%s recv:\n",interface->name);
  31.         break;
  32.     case IF_TRACE_OUT:
  33.         printf("%s sent:\n",interface->name);
  34.         break;
  35.     }
  36.     if(bp == NULLBUF || (size = len_mbuf(bp)) == 0){
  37.         printf("empty packet!!\n");
  38.         fflush(stdout);
  39.         return;
  40.     }
  41.  
  42.     if(type < NTRACE)
  43.         func = tracef[type];
  44.     else
  45.         func = NULLFP;
  46.  
  47.     dup_p(&tbp,bp,0,size);
  48.     if(tbp == NULLBUF){
  49.         printf(nospace);
  50.         fflush(stdout);
  51.         return;
  52.     }
  53.     if(func != NULLFP)
  54.         (*func)(&tbp,1);
  55.     if(interface->trace & IF_TRACE_ASCII){
  56.         /* Dump only data portion of packet in ascii */
  57.         ascii_dump(&tbp);
  58.     } else if(interface->trace & IF_TRACE_HEX){
  59.         /* Dump entire packet in hex/ascii */
  60.         free_p(tbp);
  61.         dup_p(&tbp,bp,0,len_mbuf(bp));
  62.         if(tbp != NULLBUF)
  63.             hex_dump(&tbp);
  64.         else
  65.             printf(nospace);
  66.     }
  67.     free_p(tbp);
  68.     fflush(stdout);
  69. }
  70.  
  71. /* Dump an mbuf in hex */
  72. void
  73. hex_dump(bpp)
  74. register struct mbuf **bpp;
  75. {
  76.     int16 n;
  77.     int16 address;
  78.     void fmtline();
  79.     char buf[16];
  80.  
  81.     if(bpp == NULLBUFP || *bpp == NULLBUF)
  82.         return;
  83.  
  84.     address = 0;
  85.     while((n = pullup(bpp,buf,sizeof(buf))) != 0){
  86.         fmtline(address,buf,n);
  87.         address += n;
  88.     }
  89. }
  90. /* Dump an mbuf in ascii */
  91. void
  92. ascii_dump(bpp)
  93. register struct mbuf **bpp;
  94. {
  95.     char c;
  96.     register int16 tot;
  97.  
  98.     if(bpp == NULLBUFP || *bpp == NULLBUF)
  99.         return;
  100.  
  101.     tot = 0;
  102.     while(pullup(bpp,&c,1) == 1){
  103.         if((tot % 64) == 0)
  104.             printf("%04x  ",tot);
  105.         putchar(isprint(c) ? c : '.');
  106.         if((++tot % 64) == 0)
  107.             printf("\n");
  108.     }
  109.     if((tot % 64) != 0)
  110.         printf("\n");
  111. }
  112. /* Print a buffer up to 16 bytes long in formatted hex with ascii
  113.  * translation, e.g.,
  114.  * 0000: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f  0123456789:;<=>?
  115.  */
  116. void
  117. fmtline(addr,buf,len)
  118. int16 addr;
  119. char *buf;
  120. int16 len;
  121. {
  122.     char line[80];
  123.     register char *aptr,*cptr;
  124.     register char c;
  125.     void ctohex();
  126.  
  127.     memset(line,' ',sizeof(line));
  128.     ctohex(line,hibyte(addr));
  129.     ctohex(line+2,lobyte(addr));
  130.     aptr = &line[6];
  131.     cptr = &line[55];
  132.     while(len-- != 0){
  133.         c = *buf++;
  134.         ctohex(aptr,(int16)uchar(c));
  135.         aptr += 3;
  136.         c &= 0x7f;
  137.         *cptr++ = isprint(c) ? c : '.';
  138.     }
  139.     *cptr++ = '\r';
  140.     *cptr++ = '\n';
  141.     fwrite(line,1,(unsigned)(cptr-line),stdout);
  142. }
  143. /* Convert byte to two ascii-hex characters */
  144. static
  145. void
  146. ctohex(buf,c)
  147. register char *buf;
  148. register int16 c;
  149. {
  150.     static char hex[] = "0123456789abcdef";
  151.  
  152.     *buf++ = hex[hinibble(c)];
  153.     *buf = hex[lonibble(c)];
  154. }
  155.  
  156.